iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

今天的任務是加上編輯按鈕,讓已經存在的資料能被修改,不過同時我也要把之前有問題的部分改一改,不然編輯功能會很難加上去。

ChatGPT幫助修正功能

雖然前面學了很多,但以我現在的功力還是沒辦法在短時間內獨自修正這些功能錯誤,所以請到我們的好朋友—ChatGPT來幫忙,大家應該都知道最近出了新模型o1,他加強了邏輯功能,正好想來試看看新模型的效能怎麼樣。
我將我的程式碼全部都丟給他,並告訴他我的要求:
「這是一串記帳小網站的程式,但目前多處都有問題,其中幾個最大的問題是:1.我是使用支出和收入按鈕來決定後面輸入的內容要放到支出或收入,但現在這個按鈕還沒有用處,一律都放到支出裡了。2.這些輸入並刪除的內容在local storage都沒有被刪掉,重新載入還會出現。
其他還有任何別的問題也幫我一起修改,謝謝你!」
我輸入了上述要求,請他幫我改正我的程式碼,他總共思考了79秒,與4o不同,4o很快就輸出結果,不過看過內容後,會發現o1更加縝密,跟著他把程式修改後,更是完全沒有錯誤,符合我的所有要求,而之前使用4o,還是需要自己再看哪些小地方需要debug,且並不是所有要求都能達成。這就是o1的厲害之處。
不過把所有程式碼放上來太多了,我就直接放修改成功的網頁畫面。
https://ithelp.ithome.com.tw/upload/images/20241001/20169208WwcYO2Ywvm.png

更新JavaScript

這裡我們要開始實現編輯按鈕的功能,首先,來更新JavaScript。
addExpense():

//  創建編輯按鈕
document.getElementById("description").value = "";
document.getElementById("amount").value = "";
document.getElementById("note").value = "";

let editButton = document.createElement("button");
editButton.innerText = "編輯";
editButton.style.marginLeft = "10px";
editButton.addEventListener("click",function(){
    editExpense(expense, listItem);
});

其實很類似之前加上刪除按鈕那樣,另外,要記得在後面加上listItem.appendChild(editButton); 才會添加按鈕。
編寫editExpense():
這是針對編輯過程寫的函式。

function editExpense(expense, listItem) {
    //創建輸入框
    let descriptionInput = document.createElement("input");
    descriptionInput.type = "text";
    descriptionInput.value = expense.description;

    let amountInput = document.createElement("input");
    amountInput.type = "number";
    amountInput.value = expense.amount;

    let noteInput = document.createElement("input");
    noteInput.type = "text";
    noteInput.value = expense.note;

    //創建保存按鈕
    let saveButton = document.createElement("button");
    saveButton.innerText = "保存";
    saveButton.style.marginLeft = "10px";
    saveButton.addEventListener("click", function () {
        saveEditedExpense(expense, descriptionInput.value, parseFloat(amountInput.value), noteInput.value, listItem);
    });

    //清空當前列表
    listItem.innerHTML = '';
    listItem.appendChild(descriptionInput);
    listItem.appendChild(amountInput);
    listItem.appendChild(noteInput);
    listItem.appendChild(saveButton);
}

編寫saveEditedExpense():
針對保存編輯後資料的函式,同時也要更新Local Storage。

function saveEditedExpense(expense, newDescription, newAmount, newNote, listItem) {
    if (newDescription === "" || isNaN(newAmount) || newAmount <= 0) {
        alert("請輸入完整且有效的支出類別與金額!");
        return;
    }

    // 更新總支出
    totalAmount -= expense.amount;
    totalAmount += newAmount;
    document.getElementById("total-amount").innerText = totalAmount.toFixed(2);
    updateNetAmount();

    expense.description = newDescription;
    expense.amount = newAmount;
    expense.note = newNote;

    // 更新Local Storage
    let expenses = JSON.parse(localStorage.getItem("expenses")) || [];
    let index = expenses.findIndex(e => e.id === expense.id);
    if (index !== -1) {
        expenses[index] = expense;
        localStorage.setItem("expenses", JSON.stringify(expenses));
    }

    // 恢復顯示
    listItem.innerHTML = `${expense.description} - $${expense.amount.toFixed(2)} <br> 備註:${expense.note}`;
    listItem.classList.add("expense-item");

    // 重新添加按鈕
    let deleteButton = document.createElement("button");
    deleteButton.innerText = "刪除";
    deleteButton.style.marginLeft = "10px";
    deleteButton.addEventListener("click", function () {
        expenseList.removeChild(listItem);
        totalAmount -= expense.amount;
        document.getElementById("total-amount").innerText = totalAmount.toFixed(2);
        updateNetAmount();

        let expenses = JSON.parse(localStorage.getItem("expenses")) || [];
        expenses = expenses.filter(e => e.id !== expense.id);
        localStorage.setItem("expenses", JSON.stringify(expenses));
    });

    let editButton = document.createElement("button");
    editButton.innerText = "編輯";
    editButton.style.marginLeft = "10px";
    editButton.addEventListener("click", function () {
        editExpense(expense, listItem);
    });

    listItem.appendChild(deleteButton);
    listItem.appendChild(editButton);
}

收入的部分也是這樣加上功能,另外也要注意,Local Storage的地方也需要編輯,與之前的刪除鈕相同,需要加上編輯按鈕。因為這樣會有太多、太長的程式碼,這裡就不放上了。

測試功能

在過程中還是出現了一些bug需要除,不過在ChatGPT的幫助下很快就完成了,成功加上編輯功能,讓使用者能修改已在列表中的項目。
https://ithelp.ithome.com.tw/upload/images/20241001/20169208sK6sYN378r.png
以上是編輯界面,可以更改項目、金額以及備註,完成後按保存即可。
https://ithelp.ithome.com.tw/upload/images/20241001/20169208dCaKlwSaSE.png
這裡是更改後的樣子,可以再做編輯,不過我覺得刪除和編輯鈕離太遠了,之後有時間把他們靠近一點。

參考資料

https://chatgpt.com/


上一篇
DAY16 響應式設計-支援多裝置瀏覽
下一篇
DAY18 引入圖表功能
系列文
新手開發日記:跟著ChatGPT做記帳網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言